﻿#define _CRT_SECURE_NO_WARNINGS

#include<iostream>

using namespace std;

class Date
{
public:
	//成员函数
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

	int GetMonthDay()
	{
		//定义13个空间，一一对应，二月先给28天
		int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

		//闰年的2月有29天
		if (_month == 2 && ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400 == 0)))
		{
			return 29;
		}
		//这里最好把month == 2放在最前面判断，因为如果不是2月，就不用判断是不是闰年了

		return monthArray[_month];
	}

	//Date operator+(int day)
	//{
	//	Date tmp = *this;	//用tmp来拷贝d1，因为我们不希望改变d1
	//	tmp._day += day;
	//	while (tmp._day > tmp.GetMonthDay())
	//	{
	//		// 日满了，月进位
	//		tmp._day -= tmp.GetMonthDay();
	//		++tmp._month;
	//
	//		// 月满了，年进位
	//		if (tmp._month == 13)
	//		{
	//			++_year;
	//			tmp._month = 1;			//月归1
	//		}
	//	}
	//	return tmp;						//tmp出了作用域消失，不能用传引用返回
	//}

	Date operator+(int day)
	{
		Date tmp(*this);
		tmp += day;
		return tmp;
	}

	Date& operator+=(int day)
	{
		_day += day;
		while (_day > this->GetMonthDay())
		{
			_day -= this->GetMonthDay();
			// 日满了，月进位
			++_month;

			// 月满了，年进位
			if (_month == 13)
			{
				++_year;
				_month = 1;			//月归1
			}

		}
		return *this;				//d1一直都在，可以用传引用返回
	}

	// 这里实际上是：d1.operator<(d2)
	bool operator<(const Date& d2)
	{
		if (_year < d2._year)
		{
			return true;
		}
		else if (_year == d2._year && _month < d2._month)
		{
			return true;
		}
		else if (_year == d2._year && _month == d2._month && _day < d2._day)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	bool operator==(const Date& d)
	{
		return _year == d._year && _month == d._month && _day == d._day;
	}

	//比较挫的写法
	/*bool operator<=(const Date& d)
	{
		if (_year < d._year)
		{
			return true;
		}
		else if (_year == d._year && _month < d._month)
		{
			return true;
		}
		else if (_year == d._year && _month == d._month && _day <= d._day)
		{
			return true;
		}
		else
		{
			return false;
		}
	}*/

	//直接复用
	bool operator<=(const Date& d)
	{
		return *this < d || *this == d;
	}

	bool operator>(const Date& d)
	{
		return !(*this <= d);
	}

	bool operator>=(const Date& d)
	{
		return !(*this < d);
	}

	bool operator!=(const Date& d)
	{
		return !(*this == d);
	}

private:
	//成员变量
	int _year;
	int _month;
	int _day;
};

//注意：要想这样定义函数，一个最暴力的方法是把private注释掉，会出问题
//bool operator<(const Date& d1, const Date& d2)
//{
//	if (d1._year < d2._year)
//	{
//		return true;
//	}
//	else if (d1._year == d2._year && d1._month < d2._month)
//	{
//		return true;
//	}
//	else if (d1._year == d2._year && d1._month == d2._month && d1._day < d2._year)
//	{
//		return true;
//	}
//	else
//	{
//		return false;
//	}
//}

int main()
{
	Date d1(2023, 7, 20);
	Date d2(2023, 8, 1);
	
	cout << (d1 < d2) << endl;				
	//cout << (operator<(d1, d2)) << endl;	// 显示写
	cout << d1.operator<(d2) << endl;		//显示写

	cout << (d1 == d2) << endl;
	cout << (d1 <= d2) << endl;
	//注意不能写成:
	//cout << d1 < d2 << endl;		
	//因为<<的优先级比<高
	cout << (d1 > d2) << endl;
	cout << (d1 >= d2) << endl;
	cout << (d1 != d2) << endl;
	
	Date d3 = d1 + 50;
	d1.print();
	d3.print();
	d3 += 20;
	d3.print();
	return 0;
}